using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RubyController : MonoBehaviour
{
    public float timeInvincible = 2.0f;
    //声明一个无敌时间为两秒
    bool isInvincible;
    //用于判断是否无敌的依据
    float invincibleTimer;
    //无敌时间计时器

    public int maxhealth = 5;
    //声明两个int型变量作为最大生命值（公开）与当前生命值（隐藏）

    public int health{get{return currenthealth;}}
    //使用属性满足某些对象的封装性，只有使用它才能获取或者改变该对象
    private int currenthealth;
    public float speed;

    new Rigidbody2D rigidbody2D;
    //声明一个2d刚体对象
    float horizontal;
    float vertical;
    //获取系统输入
    Animator animator;
    // 声明一个 animator 对象
    Vector2 lookDirection = new Vector2(1,0);
    // 声明一个二位向量，用来记录ruby静止时的朝向
    Vector2 move;
    // 移动二维向量
    public GameObject projectilePrefab;
    // 声明一个公开的游戏对象预制件，来生成子弹
    private void Start()
    {
        //QualitySettings.vSyncCount = 0;//垂直同步为0
        //Application.targetFrameRate = 10;//锁帧֡10
        
        rigidbody2D = GetComponent<Rigidbody2D>();
        //获取当前游戏对象的刚体组件
        animator = GetComponent<Animator>();
        // 获取当前对象
        currenthealth = maxhealth;
        //游戏开始，角色生命值初始化为最大生命值
    }

    void Update()
    {
        horizontal = Input.GetAxis("Horizontal");
        //获取横向输入
        vertical = Input.GetAxis("Vertical");
        //获取纵向输入

        if (isInvincible)
        {
            invincibleTimer = invincibleTimer - Time.deltaTime;
            //每次update减少计时器时间
            if (invincibleTimer < 0)    //无敌时间结束
            {
                isInvincible = false;
            }
        }

        move = new Vector2(horizontal,vertical);
        // 创建一个二维向量来记录 ruby 的移动信息
        // 判断是否移动的条件是 该向量的 horizontal 或 vertiacl 不为零
        // ruby 的移动方向即为面向，当 ruby 停止移动时，面向不变
        if (!Mathf.Approximately(move.x,0.0f) || !Mathf.Approximately(move.y,0.0f))
        {
            lookDirection.Set(move.x,move.y);
            // 面向设置为移动方向
            lookDirection.Normalize();
            // "归一化" 将一些仅仅表示方向的向量长度标准化 （一般要进行这样的处理）
        }
        animator.SetFloat("Look X",lookDirection.x);
        animator.SetFloat("Look Y",lookDirection.y);
        // 将 ruby 的面向传递给 animator
        animator.SetFloat("Speed",move.magnitude);
        // 返回向量的 magnitude 属性，常用该属性表示向量的长度，是一个绝对值

        if (Input.GetKeyDown(KeyCode.C))    // 当检测到键盘输入 C 时，调用发射子弹的方法
        {
            Launch();
        }    
    }

    void FixedUpdate()
    {
        Vector2 position = transform.position;
        //创建一个Verctor2的对象去装当前位置
        position.x = position.x + speed*horizontal*Time.deltaTime;
        position.y = position.y + speed * vertical*Time.deltaTime;
        //改变横纵坐标位置
        rigidbody2D.position = position;
        //用改变后的位置去替代原位置
    }

    public void changeHealth(int amount)    //生命值改变函数
    {
        //判断是否为扣血
        if (amount < 0)
        {
        //判断是否处于无敌状态
            if (isInvincible)
            {
                //是，直接返回不执行操作
                return;
            }
            //不是无敌则扣血进入无敌状态
            isInvincible = true;
            invincibleTimer = timeInvincible;

            animator.SetTrigger("Hit");
            // 受伤后，传回 Hit 状态，播放受伤动画
        }

        currenthealth = Mathf.Clamp(currenthealth + amount, 0 , maxhealth);
        //让当前生命值等于当前生命值加上改变量且控制在0到最大生命值的范围内
        Debug.Log("你的生命值为：" + currenthealth + "/" + maxhealth);
        //在控制台打印输出当前生命值
    }

    void Launch()
    {
        GameObject projectileObject = Instantiate(projectilePrefab,rigidbody2D.position+Vector2.up*0.5f,Quaternion.identity);
        // 在指定的位置创建出来的游戏对象
        Projectile projectile = projectileObject.GetComponent<Projectile>();
        // 获取子弹预制件的脚本方法
        projectile.Launch(lookDirection,300);
        // 调用其中的 Launch 方法
        animator.SetTrigger("Lauch");
    }
}
